using System;
using System.Collections;
using System.Text.RegularExpressions;

////////////////////////////////////////////////////////////////////////////////////////////////////
// namespace: Dimok
//
// summary:	.
////////////////////////////////////////////////////////////////////////////////////////////////////
namespace Dimok{

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	List of strings. </summary>
	///
	/// <remarks>	Dimon, 11/23/2010. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public class StringList : ArrayList{

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Default constructor. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public StringList():base(){}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="values">	The values. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public StringList(string values):this(values,','){}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="values">			The values. </param>
		/// <param name="separator">	The separator. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public StringList(string values,char separator):base(values.Split(separator)){}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Constructor. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="array">	The array. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public StringList(ICollection array){
			foreach( object o in array )
				Add(o+"");
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Adds a range to 'distinct'. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="array">		The array. </param>
		/// <param name="distinct">	true to distinct. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public void AddRange(ICollection array,bool distinct){
			if( !distinct )this.AddRange(array);
			else
				foreach( string el in array )
					if( !this.Contains(el) )this.Add(el);
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Indexer to get items within this collection using array index syntax. </summary>
		///
		/// <value>	The indexed item. </value>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public new string this[int index]{get{ return (string)base[index];}}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Filters. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="filter">	The filter. </param>
		///
		/// <returns>	. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public StringList Filter(string filter){
			StringList sl = new StringList();
			foreach(string item in this )
				if( Regex.IsMatch(item,filter,RegexOptions.IgnoreCase) )
					sl.Add(item);
			return sl;
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	string[] casting operator. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="a">	a. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public static implicit operator string[](StringList a){return (string[])a.ToArray(typeof(string));}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	int[] casting operator. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="a">	a. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public static implicit operator int[](StringList a){
			ArrayListEx al = new ArrayListEx();
			foreach( string s in a )
				al.Add(int.Parse(s));
			return al;
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	string casting operator. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="a">	a. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public static implicit operator string(StringList a){return a.Join();}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the join. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <returns>	. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public string Join(){return Join(",");}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets the join. </summary>
		///
		/// <remarks>	Dimon, 11/23/2010. </remarks>
		///
		/// <param name="separeator">	The separeator. </param>
		///
		/// <returns>	. </returns>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public string Join(string separeator){return string.Join(separeator,this);}

	}
}
